package pATT.SAVER.courseStruct;

import java.io.File;
import java.util.StringTokenizer;
import java.util.Vector;

import pATT.core.Utils;

/**
 * 
 * @author Ignacio
 *
 */
public class Contenidos {
	private Vector<Unidad> unidades = null;

	public Contenidos(String estructura) {
		unidades = new Vector<Unidad>();
		unidades.add(0, null);

		if(Utils.isFile(estructura)){
			//levantar la estructura
			levantarEstructura(estructura);
			
		}
		
	}

	private void levantarEstructura(String estructura) {
		String content = Utils.fileToString(new File(estructura));
		StringTokenizer tokenizer = new StringTokenizer(content, "\n");
		int posUnidad = 1;
		int posTema = 1;
		int posConcepto = 1;
		Unidad unidad = null;
		Tema tema = null;
		Concepto concepto = null;
		Vector<Tema> temas = null;
		Vector<Concepto> conceptos = null;
		
		while (tokenizer.hasMoreTokens()) {
			String token = tokenizer.nextToken().trim();
			if(token.startsWith("Unidad")){
//				System.out.println(token.toString());
					temas = new Vector<Tema>();
					temas.add(0, null);
					posTema = 1;
					unidad = new Unidad(token, temas);
					unidades.add(posUnidad, unidad);
					posUnidad++;
			}else if(token.startsWith("Tema")){
//				System.out.println("  "+token.toString());
					conceptos = new Vector<Concepto>();
					conceptos.add(0, null);
					posConcepto = 1;
					tema = new Tema(token, conceptos);
					temas.add(posTema, tema);
					posTema++;
			}else if(token.startsWith("+")){
//				System.out.println("    "+token.toString());
					concepto = new Concepto(token);					
					conceptos.add(posConcepto, concepto);
					posConcepto++;
			}
			
			
		}
	}

	public Vector<Unidad> getUnidades() {
		return unidades;
	}
	
	public boolean isEmpty(){
		return (unidades == null || unidades.isEmpty());
	}
	/**
	 * Retorna si existe la unidad
	 * @param name
	 * @return
	 */
	public Unidad obtenerUnidad(String name){
		Unidad unidad = null;
		Unidad result = null;
		for (int i = 0; i < getUnidades().size(); i++) {
			unidad = getUnidades().get(i);
			if((result = unidad.obtenerUnidad(name)) != null){
				return result;
			}
		}
		return null;
	}
	/**
	 * Retorna si existe la unidad, dado el idUnidad
	 * @param name
	 * @return
	 */
	public Unidad obtenerUnidad(int idUnidad){
		return unidades.get(idUnidad);
		
	}
	/**
	 * Retorna si existe el ID del Tema, dado el nombre del tema
	 * @param name
	 * @return
	 */
	public int obtenerIDTema(String nameTema){
		Unidad unidad = obtenerUnidadTema(nameTema);
		return unidad.obtenerIDTema(nameTema);
		
	}
	/**
	 * Retorna la unidad siguiente
	 * @param name
	 * @return
	 */
	public Unidad obtenerUnidadSiguiente(Unidad unidadActual){

		int max = getUnidades().size();
		for (int i = 0; i < getUnidades().size(); i++) {
			Unidad unidad = getUnidades().get(i);
			if(unidad.equals(unidadActual)){
				if(max>(i+1)){
					return getUnidades().get(i+1);
				}else{
					return null;
				}
			}
		}
		return null;
	}
	
	/**
	 * Retorna el tema siguiente
	 * @param name
	 * @return
	 */
	public Tema obtenerTemaSiguiente(Unidad unidadActual, int idTema){
		Tema tema = unidadActual.obtenerTemaSiguiente(idTema);
		if(tema == null){
			Unidad unidad = obtenerUnidadSiguiente(unidadActual);
			if(unidad != null){
				tema = unidad.getTemas().firstElement();
			}
		}
		return tema;
	}

	/**
	 * Retorna la instancia Unidad si es la buscada, dado un Concepto
	 * @param nameConcepto
	 * @return
	 */
	public Unidad obtenerUnidadConcepto(String nameConcepto){
		Unidad unidad = null;
		for (int i = 0; i < getUnidades().size(); i++) {
			unidad = getUnidades().get(i);
			if(unidad.obtenerConcepto(nameConcepto) != null){
				return unidad;
			}
		}
		return null;

	}
	
	/**
	 * Retorna la instancia Unidad si es la buscada, dado un Tema
	 * @param nameTema
	 * @return
	 */
	public Unidad obtenerUnidadTema(String nameTema){
		Unidad unidad = null;
		for (int i = 0; i < getUnidades().size(); i++) {
			unidad = getUnidades().get(i);
			if(unidad.obtenerTema(nameTema) != null){
				return unidad;
			}
		}
		return null;

	}

	/**
	 * Retorna la instancia Tema si es la buscada, dado un Concepto
	 * @param nameConcepto
	 * @return
	 */
	public Tema obtenerTemaConcepto(String nameConcepto){
		Unidad unidad = null;
		Tema result = null;
		for (int i = 0; i < getUnidades().size(); i++) {
			unidad = getUnidades().get(i);
			if((result = unidad.obtenerTemaConcepto(nameConcepto)) != null){
				return result;
			}
		}
		return null;

	}

	/**
	 * Retorna si existe el tema
	 * @param name
	 * @return
	 */
	public Tema obtenerTema(String name){
		Unidad unidad = null;
		Tema result = null;
		for (int i = 0; i < getUnidades().size(); i++) {
			unidad = getUnidades().get(i);
			if((result = unidad.obtenerTema(name)) != null){
				return result;
			}
		}
		return null;

	}
	/**
	 * Retorna si existe el concepto
	 * @param name
	 * @return
	 */
	public Concepto obtenerConcepto(String name){
		Unidad unidad = null;
		Concepto result = null;
		for (int i = 0; i < getUnidades().size(); i++) {
			unidad = getUnidades().get(i);
			if((result = unidad.obtenerConcepto(name)) != null){
				return result;
			}
		}
		return null;

	}

	/**
	 * Retorna true si son inmediatamente contiguo
	 * ((primero+1) == segundo) || ((primero-1) == segundo)
	 * @param primero
	 * @param segundo
	 * @return
	 */
	public boolean sonConsecutivos(int primero, int segundo){
		return(((primero+1) == segundo) || ((primero-1) == segundo));
	}
}
